扩展CLI开发:使用minimist解析参数快速初始化模板
概述
本节扩展 CLI 工具功能,使用 minimist 轻量级参数解析库实现命令行参数的快速解析,支持通过 --template 等参数直接指定模板,省去交互式选择流程。
为什么选择 minimist
| 参数解析库 | 体积 | 功能复杂度 | 适用场景 |
|---|---|---|---|
| minimist | ~1KB | 轻量单一 | 简单参数解析,create-vue 等项目使用 |
| commander | 中等 | 完善(子命令、帮助) | 中大型 CLI 工具 |
| yargs | 较大 | 最丰富(交互、补全) | 复杂 CLI 应用 |
minimist 的核心优势在于极致轻量,被 create-vue 等知名项目采用,足以满足大多数模板初始化场景的参数解析需求。
安装与基本用法
# 在 monorepo 项目根目录安装
pnpm add minimist -w -D
bash
import minimist from 'minimist'
// 解析 process.argv
// 用法: create-admin my-project --template base
const argv = minimist(process.argv.slice(2))
console.log(argv)
// 输入: create-admin my-project --template base --force
// 输出: { _: ['my-project'], template: 'base', force: true }
typescript
参数解析规则
minimist 支持多种参数格式,解析规则如下:
| 输入格式 | 解析结果 | 说明 |
|---|---|---|
--template base | { template: 'base' } | 长选项带值 |
-t base | { t: 'base' } | 短选项带值 |
--force | { force: true } | 布尔标志 |
--no-force | { force: false } | 否定布尔 |
my-project | { _: ['my-project'] } | 位置参数(_ 数组) |
实战:支持参数快速初始化模板
import minimist from 'minimist'
import prompts from 'prompts'
import path from 'path'
import fs from 'fs'
// 支持的模板列表
const TEMPLATES = ['base', 'admin', 'cdn', 'electron'] as const
type Template = typeof TEMPLATES[number]
interface CliArgs {
_: string[]
template?: string
force?: boolean
}
async function init() {
const argv = minimist(process.argv.slice(2)) as CliArgs
// 位置参数中的项目名称
const targetDir = argv._[0]
// 通过参数直接指定模板,跳过交互式选择
let template: Template | undefined
if (argv.template) {
if (TEMPLATES.includes(argv.template as Template)) {
template = argv.template as Template
} else {
console.error(`无效的模板名称: ${argv.template}`)
console.log(`可用模板: ${TEMPLATES.join(', ')}`)
return
}
}
// 如果没有通过参数指定,则进入交互式选择
if (!template) {
const result = await prompts({
type: 'select',
name: 'template',
message: '选择项目模板',
choices: TEMPLATES.map(t => ({ title: t, value: t }))
})
template = result.template
}
// 如果没有通过参数指定目录,交互式输入
const dir = targetDir || (await prompts({
type: 'text',
name: 'dir',
message: '项目名称',
initial: 'my-project'
})).dir
const dest = path.resolve(process.cwd(), dir)
// 检查目录是否存在
if (fs.existsSync(dest) && !argv.force) {
const { overwrite } = await prompts({
type: 'confirm',
name: 'overwrite',
message: `目录 ${dir} 已存在,是否覆盖?`,
initial: false
})
if (!overwrite) return
}
console.log(`正在使用 ${template} 模板创建项目到 ${dest}`)
// 后续模板拷贝逻辑...
}
init()
typescript
使用示例
# 交互式创建(无参数)
create-admin
# 直接指定项目名和模板
create-admin my-project --template admin
# 强制覆盖已存在目录
create-admin my-project --template base --force
# 短选项形式
create-admin my-project -t electron
bash
minimist 高级配置
const argv = minimist(process.argv.slice(2), {
// 指定哪些参数为布尔类型
boolean: ['force', 'help'],
// 指定字符串类型的参数
string: ['template'],
// 参数别名
alias: {
t: 'template',
f: 'force',
h: 'help'
},
// 默认值
default: {
template: 'base',
force: false
},
// 遇到 -- 停止解析
'--': true
})
typescript
与 create-vue 的对比
create-vue 同样使用 minimist 进行参数解析,其设计思路值得借鉴:
// create-vue 的简化实现
const argv = minimist(process.argv.slice(2), {
boolean: ['force', 'ts']
})
// argv._[0] → 项目名称
// argv.force → 是否覆盖
// argv.ts → 是否使用 TypeScript
typescript
小结
- minimist 体积仅 ~1KB,是 CLI 参数解析的轻量级首选
- 支持短选项(
-t)、长选项(--template)、布尔标志(--force)等常见格式 - 配合
prompts可实现"参数优先 + 交互兜底"的灵活 CLI 体验 - 被业界广泛采用(create-vue 等),API 稳定可靠
↑